package com.tedu.api.list;

import org.junit.Test;

import java.util.*;

/**
 * Collection顶级集合容器
 * List集合【接口】继承与Collection【接口】
 * List集合：存储重复并且有序的元素
 * 注意：List集合类似数组，有些方法与数组使用一致
 * List集合【接口】
 * java.util.ArrayList:数组实现【常用】
 *
 *
 * java.util.LinkedList:链表实现
 *
 * 以上两个类使用方法完全一致
 *
 */
public class ListAPI {
    /**
     * List接口--提供get方法，可以被ArrayList类重写
     * <p>
     * get(int index)  返回值：E
     */
    @Test
    public void testGet() {
        //多态方式：父类引用指向子类对象【常用】

       /*<String> list=new ArrayList<>();
        list.get(0);
        //直接创建实现类对象
        ArrayList<String> al=new ArrayList<>();
        al.get(0);*/
        List<String> list = new ArrayList<>();
        list.add("西游记");
        list.add("水浒传");
        list.add("红楼梦");
        System.out.println("打印List集合：" + list);
        //获取下标：1
        String index = list.get(1);
        System.out.println("取出集合元素：" + index);
        //遍历集合内容---普通for
        for (int i = 0; i < list.size(); i++) {  //i 下标
            index = list.get(i);
            System.out.println("获取集合全部元素：" + index);
        }
    }

    /**
     * List接口下方法
     * 添加、替换、移除
     * add(int index,E e)方法  返回值：void  重载方法
     * 作用：将给定元素插入到指定位置
     * set()方法
     * remove()方法
     */
    @Test
    public void testASR() {
        List<String> list = new ArrayList<>();//创建集合
        list.add("one");
        list.add("two");
        list.add("three");
        //需求：在集合  two元素前添加  "2"
        list.add(1, "2");//index1.element"2"(在第二个元素前加一个2)
        System.out.println("插入元素：" + list);
        //需求：在集合  2元素  将2元素替换成 二
        list.set(1, "二");
        System.out.println(list);
        list.remove(1);
        System.out.println(list);
        //需求:删除集合中”二“的元素
        list.remove("二");  //Collection接口remove方法
        list.remove(1);//List接口remove，通过下标，删元素
        System.out.println("删除元素的集合：" + list);
    }
    /**List 提供可以获取子集方法      返回值:List<E>{Object对象}
     * subList(int start,int end)    含头不含尾
     * 作用：截取集合中范围内子集
     *
     */
    @Test
    public void testSubList(){
        //创建一个集合先  类型为Integer
        List<Integer> list=new ArrayList<>();
        //需求:添加10个元素，元素数0~9
        for(int i=0;i<10;i++){//所有集合重写父级的方法!    普通for循环
            list.add(i);//add()添加--重写:Collection-add方法
        }

        //打印集合
        System.out.println("增加元素后的集合："+list);
        List<Integer> list1=list.subList(3,9);//进行截取  需求:获取子集，获取3-8的元素
        System.out.println("获取子集："+list1);  //打印子集合  用这个东西打印出来把想要的开头带上，结尾+1

        //扩大十倍方法   先for循环
        List<Integer> list2=list.subList(2,8);
        for(int i=0;i<list2.size();i++){//获取子集的下标  并设置子集
            list2.set(i,list2.get(i)/*获取i中值*/*10/*乘以10*/);//get获取下标元素
        }
        System.out.println("乘以10："+list2);

        //删除list元素中1-7的元素,子集消除        clear清除
        List<Integer> listRem=list.subList(1,8);//进行清除
        listRem.clear();//进行删除    clear是全部删除
        System.out.println("阴间黑土"+list);//打印最初的list0-9,然后将1-7进行删除
        //总结:获取子集，打印子集没有操作，清空子集，原来集合移除部分子集
        //在list中将一部分元素提取出来用clear清除，最后打印原List的到删除后的list







    }

    /**
     * 数组转集合
     * Arrays工具类:提供静态方法 asList(数组引用)
     *             asList(数组引用):这个牢底可以将数转为集合
     * 注意:
     */
    @Test
    public void testArrays() {
        //创建字符串静态数组  静态数组  静态数组
        String[] array = {"黑土", "青水", "紫狗"};//静态数组创建，给定值 初始值
        List<String> list = Arrays.asList(array);/*把定值整进来*/    //将数组转换为集合       ------软件更新
        //将list阴间集合中的"青水"改为"死水"  用.size方法进行修改
        list.set(1, "死水");//1是顺序  从0开始 青水是1 黑土是0
        // System.out.println("阴间忍者："+list);
        //增强for   添加元素[add方法   add("解斑")]
        for (String str : array) {//不同构造器不同方法  String Object
            /**
             * UnsupportedOperationException
             */
            //list.add("解斑");
        }

        /**
         * List构造器使用:传入有参构造器【类型：其他集合，功能:addAll】
         * 创建集合 List<String> lists=new ArrayList(集合引用);
         *
         */
        List<String> lists=new ArrayList<>();
        //集合构造器参数:集合引用--lists集合元素添加至listes集合中
        //替代:addAll方法  操作:并集
        List<String> listes=new ArrayList<>(lists);
    }

    /**
     * 集合排序
     * java.util.Random:伪随机数类   在java.util包中
     * nextInt(数值)  功能:返回一个数值内伪随机数
     * 导入包问题：通用导入方式有没有  √   通配符 * 代表所有
     *              如果类存在与util工具包下，例如:import java.util.*
     *             类最上方：import java.util.Random
     *                     import java.util.Random
     *                     import java.util.ArrayList
     *需求:创建随机生成10个元素的集合【100以内】
     */
    @Test
    public void testRandom(){
        List<Integer> list=new ArrayList<>();//创建一个集合
        //创建随机数对象
        Random random=new Random();
        //给list集合添加10个元素
        for(int i=0;i<10/*添加的数量*/;i++){//.list.size()别手写
            list.add(random.nextInt(100)/*随机数值区间内*/);//random.ne   在这里面进行随机
        }
        System.out.println("🐓："+list);

    }
    /**
     * 集合排序
     * Collections 工具类
     *
     * 面试题：   Collection和Collections的区别?
     *          Collection所有集合顶级接口，约定所有集合公有方法
     *          Collections工具类，提供集合操作方法
     *
     * 静态方法sotr(集合引用,比较器) 功能:按照比较器约定规则排序
     * Comparator 比较器
     * 需求：集合存汉字---按照要求排序【比较器】
     */
    @Test
    public void testSort(){
        List<String> list=new ArrayList<>();
        list.add("我类要一打米哟");
        list.add("五买一修蛋");
        list.add("奥里给大菠萝");
        Collections.sort(list);  //排序
        System.out.println("超哥："+list);
        //需求，按照长短排序
        //创建比较器对象  [匿名内部类]
        //比较器对象内部提供方法；针对集合排序操作【交换规则】
        Comparator<String> com=new Comparator<String>() {//new会帮我们输出
            //定义比较器规则:汉字长度排序---交换操作compore老弟会给你办了
            public int compare(String o1, String o2) {
                return o1.length()/*获取长度*/-o2.length();
                /**
                 * o1.length()获取第一个字符串长度
                 * o2.length()获取第二个字符串长度
                 * 汉字短的在前
                 * 返回值：大于0   假设:3-4  交换
                 *        小于0  假设:4-2 不交换
                 *        等于0  假设:3=3 不变
                 *
                 */
            }
        };//在报错的括号后面加上+;
        //比较器:规定文字短在前，使用比较器规则
        Collections.sort(list,com);
        System.out.println("按照文字长短排序:"+list);

    }
    /**
     * 总结：List集合
     * List接口集合   是Collection容器接口  的子接口
     * List子接口---无法实例化---实现类：ArrayList、LinkedList、Vector
     * 使用情况：保存一组数据，有序情况，采用List集合
     * List子接口方法就是ArrayList的方法！因为ArrayList重写List所有方法
     *
     */
    @Test
    public void testArrayList(){
        //下述方式创建对象：
        // 【常用方式：父子级对象的方法   多态：方法一致，调用父类的方法--执行父类功能
        //                                         调用子类的方法--如果与父类方法名、参数完全一致，执行子类的重写方法】
        List<String> list=new ArrayList<>();
        list.add("张三");  list.add("王五");   list.add("李四");
      //由List[ArrayList]保存集合，内存创建状态
     /*//调取几个方法
      list.add("张三");   list.set(0,"王五");
      //下述方法创建对象：只调用 ArrayList的方法
      ArrayList<String> arrayList=new ArrayList<>();
      arrayList.add("李四"); arrayList.set(0,"赵六");*/
}
}






